import xlrd
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#-------设置支持中文----------------------#
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']   #设置简黑字体
mpl.rcParams['axes.unicode_minus'] = False
#-------自定义坐标轴刻度格式----------------#
from matplotlib.ticker import FuncFormatter


# 打开文件
shdata = xlrd.open_workbook('D:\潮流频数统计模板.xls')
# 查看工作表
shdata.sheet_names()
print("正在打开工作表：" + str(shdata.sheet_names()))
# 通过文件名获得工作表,获取工作表sheet1
table = shdata.sheet_by_name('Sheet1')
# 通过索引号获得工作表,获取第0张工作表
# table = shdata.sheet_by_index(0)
print("正在获取 Sheet1 工作表数据")
# 打印data.sheet_names()可发现，返回的值为一个列表，通过对列表索引操作获得工作表1



data = pd.DataFrame({},
                   index=['0~10', '10~20', '20~30', '30~40', '40~50','50~60', '60~70', '>=70'],
                   columns='N NNE NE ENE E ESE SE SSE S SSW SW WSW W WNW NW NNW'.split())

# 获取整行的值 和整列的值，返回的结果为数组
k=0
for rowx in range(4,20):      #读取行数据
    te=table.row_values(rowx,7,19)    #读取列数据
    data.iloc[:,k]=te             #将每列数据值写入成data的行数据中
    k=k+1
# 整列值：table.col_values(start,end)
# 参数 start 为从第几个开始打印，
# end为打印到那个位置结束，默认为none
#计算频数总和，然后用data/频数，换算成频率
_sum = data.sum()           #列求和
_sum=_sum.sum()             #列求和之后再求和，得到总和
print(_sum)
data = data / _sum          #data除以总和，得到频率


N = 16 # 风速分布为16个方向
theta = np.linspace(0, 2*np.pi, N, endpoint=False) # 获取16个方向的角度值
        #np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
width = np.pi / N  # 绘制扇型的宽度，可以自行调整
labels = list(data.columns) # 自定义坐标标签为 N ， NSN， ……
# 开始绘图
plt.get_current_fig_manager().window.state('zoomed')  #图面全屏；利用plt.figure(figsize=(20,10))可设置图面的宽和高
ax = plt.subplot(111, projection='polar')    #plt.subplot(nrows, ncols, index, **kwargs)；
                                             #projection可以选择子图的类型，比如选择polar，就是一个极点图

i=0.05
j=0
for idx in data.index:
    radii = data.loc[idx]  # 取出第一行数据
    ax.bar(theta,radii, width=i, bottom=j, label=idx, tick_label=labels)
    #可以把极坐标想象成x，y坐标系，theta为x轴。radii为数据的高度，
    # width为数据的宽度bottm为该数据的底部，下一次的数据的起始位置bottm，为上一次数据的顶部
    #label为标签，
    j=j+radii
    i=i+0.03

ax.set_theta_zero_location('N') #设置零度方向北
ax.set_theta_direction(-1)    # 逆时针方向绘图
#--------自定义yaxis的刻度格式-----------#
plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda s, position: '{:.0f}%'.format(100*s)))
plt.title('潮流玫瑰图')
plt.legend(loc=(0,0), bbox_to_anchor=(1.15, -0.07)) # 将label显示出来， 并调整位置
plt.show()

